package com.yan.programercode.chapter_1.question_1;

import java.util.Stack;

/**
 * 
 * 方案二：
 * 在压入的时候，对于每个元素，不论大小，都有一个值压入了stackMin
 * 只有新元素比stackMin栈顶元素小的时候才向stackMin压入新元素，比stackMin栈顶元素大或者相等的时候，取一个当前最小值在stackMin中进行占位
 * stackMin和stackData中元素个数是相同的
 * 
 * @author Yan
 *
 */
public class MyStack2 {

	private Stack<Integer> stackData;
	private Stack<Integer> stackMin;
	
	public MyStack2() {
		stackData = new Stack<Integer>();
		stackMin = new Stack<Integer>();
	}
	
	public void push(int newNum){
		// 弹出的时候stackMin中的栈顶数据需要弹出（不区分条件），因为在压入的时候，对于每个元素，不论大小，都有一个值压入了stackMin
		// 只有新元素比stackMin栈顶元素小的时候才向stackMin压入新元素，比stackMin栈顶元素大或者相等的时候，取一个当前最小值在stackMin中进行占位
		// stackMin和stackData中元素个数是相同的
		if(this.stackMin.isEmpty()){
			this.stackMin.push(newNum);
		}else if (newNum < this.stackMin.peek()) {
			// 如果要操作的值和stackMin栈顶的值相同，也需要压入栈中，因为在pop操作的时候需要处理弹出的数据是最小值的情况
			this.stackMin.push(newNum);
		}else{
			int newMin = this.stackMin.peek();
			this.stackMin.push(newMin);
		}
		this.stackData.push(newNum);
	}
	
	public int pop(){
		if(this.stackData.isEmpty()){
			throw new RuntimeException("Your stack is empty.");
		}
		int value = this.stackData.pop();
		// 弹出的时候stackMin中的栈顶数据需要弹出（不区分条件），因为在压入的时候，对于每个元素，不论大小，都有一个值压入了stackMin
		// stackMin和stackData中元素个数是相同的
		this.stackMin.pop();
		return value;
	}
	
	public int getMin(){
		if(this.stackMin.isEmpty()){
			throw new RuntimeException("Your stack is empty.");
		}
		return this.stackMin.peek();
	}
}
